package com.atguigu.gmall.product.service.impl;

import com.atguigu.gmall.common.util.JSONs;
import com.atguigu.gmall.item.to.CategoryView;
import com.atguigu.gmall.product.to.CategoryTree;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.product.entity.BaseCategory1;
import com.atguigu.gmall.product.service.BaseCategory1Service;
import com.atguigu.gmall.product.mapper.BaseCategory1Mapper;
import com.fasterxml.jackson.core.type.TypeReference;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
* @author vvx
* @description 针对表【base_category1(一级分类表)】的数据库操作Service实现
* @createDate 2023-08-15 18:49:15
*/
@Service
public class BaseCategory1ServiceImpl extends ServiceImpl<BaseCategory1Mapper, BaseCategory1>
    implements BaseCategory1Service {

    @Autowired
    StringRedisTemplate redisTemplate;


    //    三级分类
    @Override
    public List<CategoryTree> getCategoryTreeData() {

        //        在三级分类中添加缓存
        //        读多写少的场景都适合添加缓存

        String categorys = redisTemplate.opsForValue().get("categorys");
        if(!StringUtils.isEmpty(categorys)){
            //缓存中有直接返回； 类型泛型套泛型

//            TypeReference?????
//            复杂类（list，map等）套用TypeReference
            /**
             *  使用TypeReference的原因：
             *  在 Java 中，泛型信息只在编译时存在，在运行时会擦除泛型类型信息。
             *  这就导致在序列化和反序列化过程中，无法准确地还原出原始的泛型类型
             */

            List<CategoryTree> trees = JSONs.jsonStrToObj(categorys, new TypeReference<List<CategoryTree>>() {
            });
            return trees;
        }

        //缓存中没有
        List<CategoryTree> treeData = baseMapper.getCategoryTreeData();
        redisTemplate.opsForValue().set("categorys",JSONs.toJSONStr(treeData));
        return treeData;
    }

    @Override
    public CategoryView getCategoryView(Long c3Id) {
        return baseMapper.getCategoryView(c3Id);
    }

}




